home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
fmhandsp
/
fmhandsp.bas
< prev
next >
Wrap
BASIC Source File
|
1993-11-30
|
17KB
|
600 lines
10 '
20 ' ローマ字ハングル変換(フリコレ7版)
30 ' Copyright (C) 1993 GFD02650 BIRDO
40 '
50 ' 子音 平音 G N D (R,L) M (B,V) S X (J,Z) C K T (F,P) H
60 ' 1 2 3 4 5 6 7 8 9 A B C D E
70 ' 濃音は 平音の次に Q をつける
80 ' GQ DQ (BQ,VQ) SQ (JQ,ZQ)
90 ' 11 12 13 14 15
100 ' 母音 A YA EO YEO O YO U YU EU I
110 ' 1 2 3 4 5 6 7 8 9 A
120 ' (AI,AE) (YAI,YAE) (EOI,E) (YEOI,YE) (OA,WA) (OAI,WAI,OAE,WAE)
130 ' 11 12 13 14 15 16
140 ' OI (UEO,WEO) (UE,WE) (UI,WI) EUI
150 ' 17 18 19 1A 1B
160 ' パッチム 子音に加えて
170 ' GS (NJ,NZ) NH LG LM (LB,LV) LS LT (LF,LP) LH (BS,VS)
180 ' 21 22 23 24 25 26 27 28 29 2A 2B
190 '
200 ' 変数一覧表
210 ' 単純変数
220 ' INFILE$ 入力用ファイル名
230 ' FONTFILE$ フォントファイル名
240 ' ALPHA アルファベットであることを示す
250 ' CODE1 ASCII-65
260 ' HANGULFLAG ハングルの処理中であることを示す
270 ' HANGULMODE ハングルのモードであることを示す
280 ' ATR1 アトリビュート
290 ' CFLAG 子音の処理中であることを示す
300 ' VFLAG 母音の処理中であることを示す
310 ' PFLAG パッチムの処理中であることを示す
320 ' NOCRFLAG 改行しないことを示す
330 ' COUNT 処理中の行の中での位置を示す
340 ' CCODE 子音のコード
350 ' VCOUNT 母音のカウンタ
360 ' PCOUNT パッチムのカウンタ
370 ' VOWEL 母音の確定コード
380 ' BATCIM パッチムの確定コード
390 ' CWORK 子音コード作成のためのワーク
400 ' REC フォント・ファイルのレコード番号
410 ' N レコード内の位置
420 ' WORK ファイル内の位置計算用ワーク
430 ' X,Y 画面上の座標
440 '
450 ' 配列変数
460 ' ATR(25) A-ZのASCIIコード-65を添字とし、 母音:0 子音:1 Q:2
470 ' CODE(25) A-ZのASCIIコード-65を添字とし、 上記コードを値とする
480 ' VCODE(3) 母音のコード
490 ' PCODE(1) パッチムのコード
500 ' HANGULCODE(2) 変換後のハングルのコード
510 '
520 DEFINT A-Z
530 DIM ATR(25),CODE(25),HANGULCODE(2),FONT(15)
540 RESTORE *ATTRIBUTE
550 FOR I=0 TO 25
560 READ ATR(I)
570 NEXT I
580 FOR I=0 TO 25
590 READ CODE(I)
600 NEXT I
610 CLS
620 PRINT " ローマ字ハングル変換(フリコレ7版)"
630 PRINT " Copyright (C) 1993 GFD02650 BIRDO"
640 PRINT
650 PRINT "入力するファイル(キーボードからのときはRETURNのみ)"
660 LINE INPUT INFILE$
670 IF INFILE$>"" THEN
680 OPEN "I",#1,INFILE$
690 ENDIF
700 NOCRFLAG=0
710 FONTFILE$="HANGUL.FNT"
720 *出力ファイル
730 OPEN "R",#2,"(32)"+FONTFILE$
740 IF LOF(2)=0 THEN GOTO *SETFONT
750 CLS
760 *1行読み込み
770 IF INFILE$>"" THEN
780 IF EOF(1) THEN *END
790 LINE INPUT #1,LIN$
800 ELSE
810 LOCATE 0,Y
820 LINE INPUT LIN$
830 IF LIN$="" THEN *END ' キーボードからの入力のとき
840 Y=CSRLIN
850 ENDIF
860 COUNT=0:HANGULFLAG=0:CFLAG=0:VFLAG=0:PFLAG=0
870 CCODE=0:VCODE(0)=0:VCODE(1)=0:VCODE(2)=0
880 VCOUNT=0:PCOUNT=0:PCODE(0)=0:PCODE(1)=0:PCODE(2)=0
890 HANGULMODE=-1
900 *LOOP
910 COUNT=COUNT+1
920 A$=MID$(LIN$,COUNT,1)
930 IF A$="" THEN
940 IF HANGULFLAG THEN 'ハングルの処理中であったとき
950 GOSUB *ハングルの最後
960 VFLAG=0:PFLAG=-1
970 ENDIF
980 GOSUB *ハングル表示
990 IF NOCRFLAG=0 THEN
1000 GOSUB *改行
1010 ENDIF
1020 NOCRFLAG=0
1030 GOTO *1行読み込み
1040 ENDIF
1050 IF HANGULMODE THEN
1060 GOSUB *ISALPHA
1070 ELSE
1080 ALPHA=0
1090 ENDIF
1100 IF ALPHA THEN ' ハングルのとき
1110 CODE1=ASC(A$)-65 'アルファベットのコード化
1120 IF CODE1>=26 THEN CODE1=CODE1-32 '小文字のとき
1130 ATR1=ATR(CODE1)
1140 IF HANGULFLAG THEN'ハングル続き
1150 IF ATR1=1 THEN ' 子音であるとき
1160 IF CFLAG THEN ' 子音の処理中のとき
1170 CWORK=CODE(CODE1)
1180 GOSUB *子音の処理
1190 ELSE IF VFLAG THEN ' 母音の処理中のとき
1200 GOSUB *母音の確定
1210 PFLAG=-1:PCOUNT=0
1220 GOSUB *パッチムの処理
1230 ELSE ' パッチムの処理中のとき
1240 GOSUB *パッチムの処理
1250 ENDIF
1260 ELSE IF ATR1=2 THEN' 濃音
1270 IF CFLAG THEN '子音処理中のときのQの処理
1280 CODE2=CCODE
1290 GOSUB *子音の濃音
1300 CCODE=CODE2
1310 ELSE IF PFLAG THEN' パッチム処理中のQの処理
1320 CODE2=PCODE(PCOUNT-1)
1330 GOSUB *子音の濃音
1340 PCODE(PCOUNT-1)=CODE2
1350 ELSE '母音処理中のQの処理
1360 GOSUB *母音の確定
1370 PFLAG=-1:PCOUNT=0
1380 ENDIF
1390 ELSE IF CFLAG THEN' 子音の処理中のときの母音の処理
1400 CFLAG=0:VCOUNT=0:VFLAG=-1
1410 GOSUB *子音の変換
1420 GOSUB *母音
1430 ELSE IF PFLAG THEN' パッチムの処理中のときの母音の処理
1440 PCOUNT=PCOUNT-1
1450 CWORK=PCODE(PCOUNT)
1460 CCODE=0
1470 GOSUB *パッチムの確定
1480 GOSUB *子音の処理
1490 CFLAG=0
1500 VCOUNT=0:VFLAG=-1
1510 GOSUB *子音の変換
1520 GOSUB *母音
1530 ELSE' 母音処理中のときの母音の処理
1540 GOSUB *母音
1550 ENDIF
1560 ELSE' ハングルの始まり
1570 HANGULFLAG=-1
1580 CFLAG=0
1590 VFLAG=0
1600 PFLAG=0
1610 CCODE=0
1620 PCOUNT=0
1630 VCOUNT=0
1640 IF ATR1=1 THEN '子音のとき
1650 CFLAG=-1
1660 CWORK=CODE(CODE1)
1670 GOSUB *子音の処理
1680 ELSE IF ATR1=0 THEN '母音のとき
1690 HANGULCODE(0)=8
1700 VFLAG=-1:VCOUNT=0
1710 GOSUB *母音
1720 ELSE ' Qのとき
1730 CFLAG=-1:CCODE=0
1740 ENDIF
1750 ENDIF
1760 ELSE ' ハングルでないとき
1770 IF HANGULFLAG THEN 'ハングルの処理中であったとき
1780 GOSUB *ハングルの最後
1790 HANGULFLAG=0
1800 PFLAG=0
1810 ENDIF
1820 IF A$="\" THEN
1830 GOSUB *ハングル表示
1840 COUNT=COUNT+1
1850 A$=MID$(LIN$,COUNT,1)
1860 IF A$="H" OR A$="h" THEN
1870 HANGULMODE=-1
1880 ELSE IF A$="A" OR A$="a" THEN
1890 HANGULMODE=0
1900 ELSE IF A$="C" OR A$="c" THEN
1910 NOCRFLAG=-1
1920 ELSE IF A$="%" THEN
1930 LIN$=""
1940 ELSE
1950 GOSUB *非ハングル表示
1960 ENDIF
1970 ELSE IF A$<>"-" THEN
1980 GOSUB *ハングル表示
1990 GOSUB *非ハングル表示
2000 ENDIF
2010 ENDIF
2020 GOTO *LOOP
2030 '
2040 ' ハングルの最後の処理
2050 '
2060 *ハングルの最後
2070 IF CFLAG THEN
2080 GOSUB *子音の変換
2090 ENDIF
2100 IF VFLAG THEN
2110 GOSUB *母音の確定
2120 ENDIF
2130 GOSUB *パッチムの確定
2140 RETURN
2150 '
2160 ' アルファベットかどうか調べる
2170 ' ALPHA アルファベットのとき -1
2180 ' アルファベットでないとき 0
2190 '
2200 *ISALPHA
2210 ALPHA=A$>="A" AND A$<="Z"
2220 IF ALPHA THEN RETURN
2230 ALPHA=A$>="a" AND A$<="z"
2240 RETURN
2250 '
2260 *子音の処理
2270 IF CCODE=0 THEN
2280 CCODE=CWORK
2290 ELSE IF CCODE=CWORK THEN
2300 CODE2=CCODE
2310 GOSUB *子音の濃音
2320 CCODE=CODE2
2330 ENDIF
2340 RETURN
2350 '
2360 ' 子音の濃音
2370 *子音の濃音
2380 GOSUB *パッチムの濃音
2390 IF CODE2>=&H11 THEN RETURN
2400 IF CODE2=3 THEN
2410 CODE2=&H12
2420 ELSE IF CODE2=6 THEN
2430 CODE2=&H13
2440 ELSE IF CODE2=9 THEN
2450 CODE2=&H15
2460 ENDIF
2470 RETURN
2480 '
2490 ' パッチムの濃音
2500 *パッチムの濃音
2510 IF CODE2=1 THEN
2520 CODE2=&H11
2530 ELSE IF CODE2=7 THEN
2540 CODE2=&H14
2550 ELSE IF CODE2=11 THEN
2560 CODE2=&H11
2570 ELSE IF CODE2=12 THEN
2580 CODE2=&H12
2590 ELSE IF CODE2=13 THEN
2600 CODE2=&H13
2610 ELSE IF CODE2=10 THEN
2620 CODE2=&H15
2630 ENDIF
2640 RETURN
2650 '
2660 ' 母音
2670 *母音
2680 IF VCOUNT<4 THEN
2690 VCODE(VCOUNT)=CODE(CODE1)
2700 VCOUNT=VCOUNT+1
2710 ENDIF
2720 RETURN
2730 '
2740 ' 母音の確定
2750 *母音の確定
2760 VFLAG=0
2770 IF VCOUNT=1 THEN ' 1字
2780 IF VCODE(0)=1 THEN 'A
2790 VOWEL=1
2800 ELSE IF VCODE(0)=2 THEN 'E
2810 VOWEL=&H13
2820 ELSE IF VCODE(0)=3 THEN 'I
2830 VOWEL=10
2840 ELSE IF VCODE(0)=4 THEN 'O
2850 VOWEL=5
2860 ELSE IF VCODE(0)=5 THEN 'U
2870 VOWEL=7
2880 ENDIF
2890 ELSE IF VCOUNT=2 THEN ' 2字
2900 IF VCODE(0)=1 THEN 'A
2910 IF VCODE(1)=2 OR VCODE(1)=3 THEN 'AE AI
2920 VOWEL=&H11
2930 ELSE
2940 VCOUNT=1:GOTO *母音の確定
2950 ENDIF
2960 ELSE IF VCODE(0)=2 THEN 'E
2970 IF VCODE(1)=4 THEN 'EO
2980 VOWEL=3
2990 ELSE IF VCODE(1)=5 THEN 'EU
3000 VOWEL=9
3010 ELSE
3020 VCOUNT=1:GOTO *母音の確定
3030 ENDIF
3040 ELSE IF VCODE(0)=4 THEN 'O
3050 IF VCODE(1)=1 THEN 'OA
3060 VOWEL=&H15
3070 ELSE IF VCODE(1)=3 THEN 'OI
3080 VOWEL=&H17
3090 ELSE
3100 VCOUNT=1:GOTO *母音の確定
3110 ENDIF
3120 ELSE IF VCODE(0)=5 THEN 'U
3130 IF VCODE(1)=2 THEN 'UE
3140 VOWEL=&H19
3150 ELSE IF VCODE(1)=3 THEN 'UI
3160 VOWEL=&H1A
3170 ELSE
3180 VCOUNT=1:GOTO *母音の確定
3190 ENDIF
3200 ELSE IF VCODE(0)=7 THEN 'Y
3210 IF VCODE(1)=1 THEN 'YA
3220 VOWEL=2
3230 ELSE IF VCODE(1)=2 THEN 'YE
3240 VOWEL=&H14
3250 ELSE IF VCODE(1)=4 THEN 'YO
3260 VOWEL=6
3270 ELSE IF VCODE(1)=5 THEN 'YU
3280 VOWEL=8
3290 ELSE
3300 VCOUNT=1
3310 VCODE(0)=VCODE(1)
3320 GOTO *母音の確定
3330 ENDIF
3340 ELSE IF VCODE(0)=6 THEN 'W
3350 IF VCODE(1)=1 THEN 'WA
3360 VOWEL=&H15
3370 ELSE IF VCODE(1)=2 THEN 'WE
3380 VOWEL=&H19
3390 ELSE IF VCODE(1)=3 THEN 'WI
3400 VOWEL=&H1A
3410 ELSE
3420 VCOUNT=1
3430 VCODE(0)=VCODE(1)
3440 GOTO *母音の確定
3450 ENDIF
3460 ENDIF
3470 ELSE IF VCOUNT=3 THEN ' 3字
3480 IF VCODE(0)=2 THEN 'E
3490 IF VCODE(1)=4 AND VCODE(2)=3 THEN 'EOI
3500 VOWEL=&H13
3510 ELSE IF VCODE(1)=5 AND VCODE(2)=3 THEN 'EUI
3520 VOWEL=&H1B
3530 ELSE
3540 VCOUNT=2:GOTO *母音の確定
3550 ENDIF
3560 ELSE IF VCODE(0)=4 THEN 'O
3570 IF VCODE(1)=1 AND (VCODE(2)=2 OR VCODE(2)=3) THEN 'OAE OAI
3580 VOWEL=&H16
3590 ELSE
3600 VCOUNT=2:GOTO *母音の確定
3610 ENDIF
3620 ELSE IF VCODE(0)=5 THEN 'U
3630 IF VCODE(1)=2 AND VCODE(2)=4 THEN 'UEO
3640 VOWEL=&H18
3650 ELSE
3660 VCOUNT=2:GOTO *母音の確定
3670 ENDIF
3680 ELSE IF VCODE(0)=7 THEN 'Y
3690 IF VCODE(1)=1 AND (VCODE(2)=2 OR VCODE(2)=3) THEN 'YAE YAI
3700 VOWEL=&H12
3710 ELSE IF VCODE(1)=2 AND VCODE(2)=4 THEN 'YEO
3720 VOWEL=4
3730 ELSE
3740 VCOUNT=2
3750 VCODE(0)=VCODE(1):VCODE(1)=VCODE(2)
3760 GOTO *母音の確定
3770 ENDIF
3780 ELSE IF VCODE(0)=6 THEN 'W
3790 IF VCODE(1)=1 AND (VCODE(2)=2 OR VCODE(2)=3) THEN 'WAE WAI
3800 VOWEL=&H16
3810 ELSE IF VCODE(1)=2 AND VCODE(2)=4 THEN 'WEO
3820 VOWEL=&H18
3830 ELSE
3840 VCOUNT=2
3850 VCODE(0)=VCODE(1):VCODE(1)=VCODE(2)
3860 GOTO *母音の確定
3870 ENDIF
3880 ENDIF
3890 ELSE IF VCOUNT=4 THEN ' 4字
3900 IF VCODE(0)=6 AND VCODE(1)=2 AND VCODE(2)=4 AND VCODE(3)=3 THEN 'YEOI
3910 VOWEL=&H14
3920 ELSE
3930 VCOUNT=3
3940 IF VCODE(0)=6 OR VCODE(0)=7 THEN 'Y W
3950 VCODE(0)=VCODE(1):VCODE(1)=VCODE(2):VCODE(2)=VCODE(3)
3960 ENDIF
3970 GOTO *母音の確定
3980 ENDIF
3990 ENDIF
4000 GOSUB *母音の変換
4010 RETURN
4020 '
4030 ' パッチムの処理
4040 *パッチムの処理
4050 IF PCOUNT<2 THEN
4060 PCODE(PCOUNT)=CODE(CODE1)
4070 PCOUNT=PCOUNT+1
4080 ELSE
4090 CWORK=CODE(CODE1)
4100 CCODE=0
4110 GOSUB *パッチムの確定
4120 CFLAG=-1
4130 GOSUB *子音の処理
4140 ENDIF
4150 RETURN
4160 '
4170 ' パッチムの確定
4180 *パッチムの確定
4190 IF PCOUNT=0 THEN
4200 BATCIM=0
4210 ELSE IF PCOUNT=1 THEN
4220 BATCIM=PCODE(0)
4230 ELSE
4240 IF PCODE(0)>=&H11 THEN
4250 GOSUB *パッチムの分割
4260 ELSE
4270 CODE2=PCODE(0)
4280 IF PCODE(0)=PCODE(1) THEN
4290 GOSUB *パッチムの濃音
4300 BATCIM=CODE2
4310 IF CODE2<&H11 THEN
4320 CCODE=CODE2
4330 ENDIF
4340 ELSE
4350 IF PCODE(0)=1 THEN 'G
4360 IF PCODE(1)=7 THEN 'GS
4370 BATCIM=&H21
4380 ELSE
4390 GOSUB *パッチムの分割
4400 ENDIF
4410 ELSE IF PCODE(0)=2 THEN 'N
4420 IF PCODE(1)=1 THEN 'NG
4430 BATCIM=8
4440 ELSE IF PCODE(1)=9 THEN 'NJ NZ
4450 BATCIM=&H22
4460 ELSE IF PCODE(1)=14 THEN 'NH
4470 BATCIM=&H23
4480 ELSE
4490 GOSUB *パッチムの分割
4500 ENDIF
4510 ELSE IF PCODE(0)=4 THEN 'R L
4520 IF PCODE(1)=1 THEN 'RG LG
4530 BATCIM=&H24
4540 ELSE IF PCODE(1)=5 THEN 'RM LM
4550 BATCIM=&H25
4560 ELSE IF PCODE(1)=6 THEN 'RB LB RV LV
4570 BATCIM=&H26
4580 ELSE IF PCODE(1)=7 THEN 'RS LS
4590 BATCIM=&H27
4600 ELSE IF PCODE(1)=12 THEN 'RT LT
4610 BATCIM=&H28
4620 ELSE IF PCODE(1)=13 THEN 'RF LF RP LP
4630 BATCIM=&H29
4640 ELSE IF PCODE(1)=14 THEN 'RH LH
4650 BATCIM=&H2A
4660 ELSE
4670 GOSUB *パッチムの分割
4680 ENDIF
4690 ELSE IF PCODE(0)=6 AND PCODE(1)=7 THEN 'BS VS
4700 BATCIM=&H2B
4710 ELSE
4720 GOSUB *パッチムの分割
4730 ENDIF
4740 ENDIF
4750 ENDIF
4760 ENDIF
4770 PFLAG=0:PCOUNT=0
4780 GOSUB *パッチムの変換
4790 RETURN
4800 '
4810 *パッチムの分割
4820 BATCIM=PCODE(0)
4830 CCODE=PCODE(1)
4840 CFLAG=-1
4850 RETURN
4860 '
4870 ' 子音の変換
4880 *子音の変換
4890 IF CCODE<15 THEN
4900 CODE2=CCODE
4910 ELSE
4920 CODE2=CCODE-2
4930 ENDIF
4940 HANGULCODE(0)=CODE2
4950 CCODE=0
4960 RETURN
4970 '
4980 ' 母音の変換
4990 *母音の変換
5000 IF VOWEL<11 THEN
5010 CODE2=VOWEL
5020 ELSE
5030 CODE2=VOWEL-6
5040 ENDIF
5050 HANGULCODE(1)=CODE2
5060 VOWEL=0
5070 RETURN
5080 '
5090 ' パッチムの変換
5100 *パッチムの変換
5110 IF BATCIM<15 THEN
5120 CODE2=BATCIM
5130 ELSE IF BATCIM=&H11 THEN
5140 CODE2=&H0F
5150 ELSE IF BATCIM=&H12 THEN
5160 CODE2=3
5170 ELSE IF BATCIM=&H13 THEN
5180 CODE2=6
5190 ELSE IF BATCIM=&H14 THEN
5200 CODE2=&H10
5210 ELSE IF BATCIM=&H15 THEN
5220 CODE2=9
5230 ELSE IF BATCIM<&H20 THEN
5240 CODE2=0
5250 ELSE
5260 CODE2=BATCIM-16
5270 ENDIF
5280 HANGULCODE(2)=CODE2
5290 BATCIM=0
5300 GOSUB *ハングル表示
5310 RETURN
5320 '
5330 ' ハングル表示
5340 *ハングル表示
5350 IF HANGULCODE(0)=0 THEN
5360 WORK=HANGULCODE(1)-1
5370 ELSE IF HANGULCODE(1)=0 THEN
5380 WORK=HANGULCODE(0)*589-568
5390 ELSE
5400 WORK=HANGULCODE(0)*589+HANGULCODE(1)*28+HANGULCODE(2)-595
5410 ENDIF
5420 HANGULCODE(0)=0
5430 HANGULCODE(1)=0
5440 HANGULCODE(2)=0
5450 IF WORK<0 THEN RETURN
5460 REC=WORK+1
5470 GET #2,REC
5480 FOR I=0 TO 15
5490 FIELD #2,2*I AS DMY$,2 AS F$
5500 FONT(I)=CVI(F$)
5510 NEXT I
5520 SY=Y*19.2!
5530 PUT@(X*8,SY)-(X*8+15,SY+15),FONT
5540 X=X+2
5550 IF X>79 THEN
5560 GOSUB *改行
5570 ENDIF
5580 RETURN
5590 '
5600 *改行
5610 X=0
5620 Y=Y+1
5630 IF Y>=23 THEN
5640 LOCATE 0,25:PRINT "何かキーを押してください。";:A1$=INPUT$(1)
5650 CLS:Y=0
5660 ENDIF
5670 RETURN
5680 '
5690 ' 非ハングル表示
5700 *非ハングル表示
5710 IF A$>=CHR$(&H80) THEN
5720 IF A$<CHR$(&HA0) OR A$>=CHR$(&HE0) THEN
5730 COUNT=COUNT+1
5740 A$=A$+MID$(LIN$,COUNT,1)
5750 ENDIF
5760 ENDIF
5770 IF X+LEN(A$)>80 THEN
5780 GOSUB *改行
5790 ENDIF
5800 SY=Y*19.2!
5810 SYMBOL(X*8,SY),A$,1,1
5820 X=X+LEN(A$)
5830 RETURN
5840 '
5850 ' 終了処理
5860 *END
5870 Y=24
5880 GOSUB *改行
5890 END
5900 *SETFONT
5910 CLOSE #2
5920 KILL FONTFILE$
5930 LINE INPUT "フォントファイル名は";FONTFILE$
5940 GOTO *出力ファイル
5950 '
5960 *ATTRIBUTE
5970 ' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
5980 DATA 0,1, 1,1,0, 1,1, 1,0,1, 1,1,1,1,0, 1,2,1,1, 1,0,1,0,1,0,1
5990 DATA 1,6,10,3,2,13,1,14,3,9,11,4,5,2,4,13,0,4,7,12,5,6,6,8,7,9